// Copyright (c) 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "content/browser/loader/offline_policy.h"

#include "base/command_line.h"
#include "content/public/common/content_switches.h"
#include "net/base/load_flags.h"
#include "net/http/http_response_info.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "webkit/common/resource_type.h"

namespace content {

class OfflinePolicyTest : public testing::Test {
 protected:
  virtual void SetUp() {
    CommandLine::ForCurrentProcess()->AppendSwitch(
        switches::kEnableOfflineCacheAccess);
    policy_ = new OfflinePolicy;
  }

  virtual void TearDown() {
    delete policy_;
    policy_ = NULL;
  }

  OfflinePolicy* policy_;
};

// Confirm that the initial state of an offline object is to return
// LOAD_FROM_CACHE_IF_OFFLINE until it gets changed.
TEST_F(OfflinePolicyTest, InitialState) {
  // Two loads without any reset, no UpdateStateForSuccessfullyStartedRequest.
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, true));
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, false));
}

// Completion without any network probing doesn't change result value.
TEST_F(OfflinePolicyTest, CompletedUncertain) {
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, true));
  net::HttpResponseInfo response_info;
  policy_->UpdateStateForSuccessfullyStartedRequest(response_info);
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, false));
}

// Completion with a failed network probe changes result value.
TEST_F(OfflinePolicyTest, CompletedNoNetwork) {
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, true));
  net::HttpResponseInfo response_info;
  response_info.server_data_unavailable = true;
  policy_->UpdateStateForSuccessfullyStartedRequest(response_info);
  EXPECT_EQ(net::LOAD_ONLY_FROM_CACHE,
            policy_->GetAdditionalLoadFlags(0, false));
}

// Completion with a successful network probe changes result value.
TEST_F(OfflinePolicyTest, CompletedNetwork) {
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, true));
  net::HttpResponseInfo response_info;
  response_info.network_accessed = true;
  policy_->UpdateStateForSuccessfullyStartedRequest(response_info);
  EXPECT_EQ(0, policy_->GetAdditionalLoadFlags(0, false));
}

// A new navigation resets a state change.
TEST_F(OfflinePolicyTest, NewNavigationReset) {
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, true));
  net::HttpResponseInfo response_info;
  response_info.network_accessed = true;
  policy_->UpdateStateForSuccessfullyStartedRequest(response_info);
  EXPECT_EQ(0, policy_->GetAdditionalLoadFlags(0, false));
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, true));
  EXPECT_EQ(net::LOAD_FROM_CACHE_IF_OFFLINE,
            policy_->GetAdditionalLoadFlags(0, false));
}

// Cache related flags inhibit the returning of any special flags.
TEST_F(OfflinePolicyTest, ConsumerFlagOverride) {
  EXPECT_EQ(0, policy_->GetAdditionalLoadFlags(net::LOAD_BYPASS_CACHE, true));
  net::HttpResponseInfo response_info;
  response_info.server_data_unavailable = true;
  policy_->UpdateStateForSuccessfullyStartedRequest(response_info);
  EXPECT_EQ(0, policy_->GetAdditionalLoadFlags(net::LOAD_BYPASS_CACHE, false));
}

}
